package procimagem;

public class Sobel implements Aplicavel {

	private ImagemPGM imagem;

	private ImagemPGM imagemFixa;

	public Sobel(ImagemPGM image) {
		int[][] pixels = new int[image.largura][image.altura];
		int[][] matriz = new int[image.largura][image.altura];
		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[i].length; j++) {
				pixels[i][j] = image.pixels[i][j];
				matriz[i][j] = image.pixels[i][j];
			}
		}
		this.imagem = new ImagemPGM(image.largura, image.altura,
				image.maxValue, pixels);
		this.imagemFixa = new ImagemPGM(image.largura, image.altura,
				image.maxValue, matriz);
	}

	public void aplica() {
		for (int i = 0; i < imagemFixa.largura; i++) {
			for (int j = 0; j < imagemFixa.altura; j++) {
				aplicaNoPixel(i, j);
			}
		}
	}

	public void aplicaNoPixel(int x, int y) {
		int fatA = 0;
		int fatB = 0;
		int fatC = 0;
		int fatD = 0;
		if ((x - 1) >= 0) {
			fatD += 2 * imagemFixa.pixels[x - 1][y];
		}
		if ((x + 1) < imagemFixa.largura) {
			fatC += 2 * imagemFixa.pixels[x + 1][y];
		}
		if ((y - 1) >= 0) {
			fatB += 2 * imagemFixa.pixels[x][y - 1];
		}
		if ((y + 1) < imagemFixa.altura) {
			fatA += 2 * imagemFixa.pixels[x][y + 1];
		}
		if (((x - 1) >= 0) && ((y - 1) >= 0)) {
			fatB += imagemFixa.pixels[x - 1][y - 1];
			fatD += imagemFixa.pixels[x - 1][y - 1];
		}
		if (((x + 1) < imagemFixa.largura) && ((y - 1) >= 0)) {
			fatB += imagemFixa.pixels[x + 1][y - 1];
			fatC += imagemFixa.pixels[x + 1][y - 1];
		}
		if (((x - 1) >= 0) && ((y + 1) < imagemFixa.altura)) {
			fatA += imagemFixa.pixels[x - 1][y + 1];
			fatD += imagemFixa.pixels[x - 1][y + 1];
		}
		if (((x + 1) < imagemFixa.largura) && ((y + 1) < imagemFixa.altura)) {
			fatA += imagemFixa.pixels[x + 1][y + 1];
			fatC += imagemFixa.pixels[x + 1][y + 1];
		}

		int aux1 = fatA - fatB;
		int aux2 = fatC - fatD;
		int mag = Math.abs(aux1) + Math.abs(aux2);
		if (mag > 255)
			mag = 255;
		imagem.pixels[x][y] = mag;
	}

	public ImagemPGM getImage() {
		return this.imagemFixa;
	}

	public ImagemPGM getModifiedImage() {
		return this.imagem;
	}

}
